Análise descritiva

Introdução

Metodologia

Descritiva

Quantitativos gerais:

  • Quantidade de acórdãos baixados (CJSG): 397,543
  • Quantidade de processos distintos (CJSG): 392.844
  • Quantidade de processos consultados (CPOSG): 315.197
    • O restante estava em segredo de justiça

Partes e decisão:

  • Quantidade de processos com decisão de mérito: 268.477
    • O restante estava como não conhecido, prejudicado, extinção de punibilidade, diligência etc
  • Quantidade de processos com MP como apelante ou apelado: 291.289
    • O restante estava como apelante E apelado
  • Combinando partes e decisão, temos 247.625 casos

Quantidade de decisões no tempo

Por ano (geral)

Código
library(sf)
Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1; sf_use_s2() is TRUE
Código
devtools::load_all()
ℹ Loading tjspCrim
Código
aux_decisoes |>
  dplyr::mutate(
    ano = lubridate::year(decisoes_data)
  ) |>
  dplyr::count(ano) |>
  ggplot2::ggplot(ggplot2::aes(x = ano, y = n)) +
  ggplot2::geom_line() +
  ggplot2::geom_point() +
  ggthemes::theme_hc()

Por ano (câmaras)

Código
aux_decisoes |>
  dplyr::mutate(
    ano = lubridate::year(decisoes_data),
    orgao_julgador = stringr::str_extract(orgao_julgador, ".*Câmara")
  ) |>
  dplyr::count(ano, orgao_julgador) |>
  ggplot2::ggplot(ggplot2::aes(x = ano, y = n)) +
  ggplot2::geom_line() +
  ggplot2::geom_point() +
  ggplot2::facet_wrap(ggplot2::vars(orgao_julgador)) +
  ggthemes::theme_hc()

Por mês (geral)

Código
aux_decisoes |>
  dplyr::mutate(
    ano_mes = lubridate::floor_date(decisoes_data, "month")
  ) |>
  dplyr::count(ano_mes) |>
  ggplot2::ggplot(ggplot2::aes(x = ano_mes, y = n)) +
  ggplot2::geom_line() +
  ggplot2::geom_point() +
  ggthemes::theme_hc()

Por mês (câmaras)

Código
aux_decisoes |>
  dplyr::mutate(
    ano_mes = lubridate::floor_date(decisoes_data, "month"),
    orgao_julgador = stringr::str_extract(orgao_julgador, ".*Câmara")
  ) |>
  dplyr::count(ano_mes, orgao_julgador) |>
  ggplot2::ggplot(ggplot2::aes(x = ano_mes, y = n)) +
  ggplot2::geom_line() +
  ggplot2::facet_wrap(ggplot2::vars(orgao_julgador)) +
  ggthemes::theme_hc()

Composição

Código
aux_composicao |>
  dplyr::inner_join(
    dplyr::select(aux_decisoes, file, decisoes_data),
    "file"
  ) |>
  dplyr::inner_join(
    dplyr::select(da_cposg_sem_movs, file, orgao_julgador),
    "file"
  ) |>
  dplyr::mutate(ano = lubridate::year(decisoes_data)) |>
  dplyr::group_by(ano, orgao_julgador, magistrado) |>
  dplyr::mutate(n = dplyr::n()) |>
  dplyr::ungroup() |>
  dplyr::filter(n <= 100) |>
  dplyr::distinct(ano, orgao_julgador, magistrado, n) |>
  dplyr::arrange(magistrado) |>
  dplyr::group_by(ano, orgao_julgador) |>
  dplyr::summarise(
    pessoas = paste(glue::glue("{seq_len(dplyr::n())} {magistrado} ({n})"), collapse = "<br>"),
    .groups = "drop"
  ) |>
  tidyr::pivot_wider(names_from = ano, values_from = pessoas) |>
  reactable::reactable(
    columns = list(
      `2019` = reactable::colDef(align = "left", html = TRUE),
      `2020` = reactable::colDef(align = "left", html = TRUE),
      `2021` = reactable::colDef(align = "left", html = TRUE),
      `2022` = reactable::colDef(align = "left", html = TRUE)
    ),
    striped = TRUE,
    compact = TRUE,
    highlight = TRUE,
    style = list(
      fontSize = 14
    )
  )
Código
aux_composicao |>
  dplyr::inner_join(
    dplyr::select(aux_decisoes, file, decisoes_data),
    "file"
  ) |>
  dplyr::inner_join(
    dplyr::select(da_cposg_sem_movs, file, orgao_julgador),
    "file"
  ) |>
  dplyr::mutate(
    ano = lubridate::year(decisoes_data),
    orgao_julgador = stringr::str_extract(orgao_julgador, ".*Câmara")
  ) |>
  dplyr::group_by(ano, orgao_julgador, magistrado) |>
  dplyr::mutate(n = dplyr::n()) |>
  dplyr::ungroup() |>
  dplyr::filter(n > 100) |>
  dplyr::distinct(ano, orgao_julgador, magistrado, n) |>
  dplyr::arrange(magistrado) |>
  dplyr::group_by(orgao_julgador, magistrado) |>
  dplyr::summarise(
    anos = paste(unique(sort(ano)), collapse = ", "),
    n = sum(n),
    .groups = "drop"
  ) |>
  dplyr::arrange(orgao_julgador, dplyr::desc(n)) |>
  dplyr::select(-n) |>
  reactable::reactable(
    striped = TRUE,
    compact = TRUE,
    highlight = TRUE
  )

Resultados

Código
p <- aux_plot |>
  dplyr::filter(decision == "Negaram") |>
  dplyr::mutate(camara = forcats::fct_reorder(
    orgao_julgador, prop, dplyr::last, .desc = TRUE
  )) |>
  dplyr::mutate(`Polo MP` = polo_mp) |>
  ggplot2::ggplot(ggplot2::aes(x = camara, y = prop)) +
  ggplot2::geom_col(
    fill = viridis::viridis(2, begin = .2, end = .8)[1]
  ) +
  ggplot2::facet_wrap(
    ggplot2::vars(`Polo MP`), ncol = 1,
    labeller = ggplot2::label_both
  ) +
  ggthemes::theme_hc(12) +
  ggplot2::scale_y_continuous(labels = scales::percent) +
  ggplot2::geom_hline(yintercept = .5, linetype = 2) +
  ggplot2::labs(
    x = "Câmara de Julgamento",
    y = "Taxa de não-reforma (negados)"
  )
plotly::ggplotly(p)
Figura 1: Resultados por câmara
Código
#|
p <- aux_plot_conhec |>
  dplyr::filter(decision == "Não conhecido") |>
  dplyr::mutate(camara = forcats::fct_reorder(
    orgao_julgador, prop, dplyr::last, .desc = TRUE
  )) |>
  dplyr::mutate(`Polo MP` = polo_mp) |>
  ggplot2::ggplot(ggplot2::aes(x = camara, y = prop)) +
  ggplot2::geom_col(
    fill = viridis::viridis(2, begin = .2, end = .8)[1]
  ) +
  ggplot2::facet_wrap(
    ggplot2::vars(`Polo MP`), ncol = 1,
    labeller = ggplot2::label_both
  ) +
  ggthemes::theme_hc(12) +
  ggplot2::scale_y_continuous(labels = scales::percent) +
  #ggplot2::geom_hline(yintercept = .5, linetype = 2) +
  ggplot2::labs(
    x = "Câmara de Julgamento",
    y = "Taxa de casos não conhecidos"
  )
plotly::ggplotly(p)
Figura 2: Proporção de não conhecidos por câmara

Promotor do MP

Infelizmente, não temos o nome do promotor do MP que atua no caso.

Comarca de origem

Média anual de processos por comarca de origem

Código
aux_contagens_comarca <- aux_comarca |>
  dplyr::mutate(ano = lubridate::year(decisoes_data)) |>
  dplyr::filter(ano %in% 2019:2022) |>
  dplyr::count(comarca) |>
  dplyr::filter(!is.na(comarca)) |>
  # dividimos por 4 para dar a média por ano
  dplyr::mutate(n = n / 4)

contagens_sf <- comarca_sf |>
  dplyr::left_join(aux_contagens_comarca, "comarca") |>
  dplyr::mutate(ncat = cut(
    n, c(0, 200, 500, 1000, 100000),
    labels = c(
      "Até 200", "Entre 200 e 500",
      "Entre 500 e 1.000", "Mais de 1.000"
    ),
    include.lowest = FALSE
  )) |>
  dplyr::filter(!is.na(comarca))
Código
contagens_sf |>
  ggplot2::ggplot(ggplot2::aes(fill = ncat)) +
  ggplot2::geom_sf(colour = "black", linewidth = .15) +
  ggplot2::scale_fill_viridis_d(
    begin = .2, end = .8
  ) +
  ggplot2::theme_void() +
  ggplot2::labs(
    fill = "Decisões / Ano"
  )

Versão interativa

Código
tmap::tmap_mode("view")
The legacy packages maptools, rgdal, and rgeos, underpinning the sp package,
which was just loaded, were retired in October 2023.
Please refer to R-spatial evolution reports for details, especially
https://r-spatial.org/r/2023/05/15/evolution4.html.
It may be desirable to make the sf package available;
package maintainers should consider adding sf to Suggests:.
tmap mode set to interactive viewing
Código
contagens_sf |>
  tmap::tm_shape() +
  tmap::tm_polygons(
    "ncat",
    legend.title = "Processos / ano",
    popup.vars = c("comarca", "n"),
    palette = viridis::viridis(4, 1, .2, .8)
  )

Comarca de origem por ano

Código
aux_contagens_comarca_ano <- aux_comarca |>
  dplyr::mutate(ano = lubridate::year(decisoes_data)) |>
  dplyr::filter(ano %in% 2019:2022) |>
    dplyr::filter(!is.na(comarca)) |>
  dplyr::count(comarca, ano)

contagens_sf_ano <- comarca_sf |>
  dplyr::left_join(aux_contagens_comarca_ano, "comarca") |>
  dplyr::mutate(ncat = cut(
    n, c(0, 200, 500, 1000, 100000),
    labels = c("Até 200", "Entre 200 e 500", "Entre 500 e 1.000", "Mais de 1.000")
  ))

contagens_sf_ano |>
  ggplot2::ggplot(ggplot2::aes(fill = ncat)) +
  ggplot2::geom_sf() +
  ggplot2::scale_fill_viridis_d(
    begin = .2, end = .8
  ) +
  ggplot2::facet_wrap(ggplot2::vars(ano), ncol = 2) +
  ggplot2::theme_void() +
  ggplot2::labs(
    fill = "Decisões / Ano"
  )

Versão interativa

Código
tmap::tmap_mode("view")
tmap mode set to interactive viewing
Código
contagens_sf_ano |>
  tidyr::pivot_wider(
    names_from = "ano",
    values_from = c("n", "ncat")
  ) |>
  tmap::tm_shape() +
  tmap::tm_polygons(
    c("ncat_2019", "ncat_2020", "ncat_2021", "ncat_2022"),
    legend.title = c(
      "Processos (2019)", "Processos (2020)",
      "Processos (2021)", "Processos (2022)"
    ),
    popup.vars = c("comarca", "n_2019", "n_2020", "n_2021", "n_2022"),
    palette = viridis::viridis(4, 1, .2, .8)
  ) +
  tmap::tm_facets(sync = TRUE, ncol = 2)

Unanimidade

A taxa de unanimidade geral no período é de 97.7%.

Código
p <- aux_plot_unan |>
  dplyr::filter(unanimidade == "Unânime") |>
  dplyr::mutate(camara = forcats::fct_reorder(
    orgao_julgador, prop, mean, .desc = TRUE
  )) |>
  dplyr::mutate(`Polo MP` = polo_mp) |>
  ggplot2::ggplot(ggplot2::aes(x = prop, y = camara)) +
  ggplot2::geom_point(size = 3) +
  ggplot2::geom_segment(
    ggplot2::aes(x = 0, xend = prop, y = camara, yend = camara),
    colour = viridis::viridis(2, begin = .2, end = .8)[1]
  ) +
  ggplot2::facet_wrap(
    ggplot2::vars(`Polo MP`), ncol = 1,
    labeller = ggplot2::label_both
  ) +
  ggplot2::theme_minimal(12) +
  ggplot2::scale_x_continuous(labels = scales::percent) +
  ggplot2::geom_vline(xintercept = .95, linetype = 2) +
  ggplot2::labs(
    y = "Câmara de Julgamento",
    x = "Taxa de unanimidade"
  )

plotly::ggplotly(p)
Figura 3: Unanimidade por câmara

Relatores

Proporção de negados e unanimidade por relator

Código
aux_tab_relator |>
  reactable::reactable(list(
    prop_negados = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    ),
    unanimidade = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    )
  ))

Descritivas por variável: polo MP Ativo

Código
aux_magistrado_comp |>
  dplyr::mutate(idade = as.character(cut(idade, c(50, 60, 70, 80)))) |>
  tidyr::replace_na(list(idade = "-")) |>
  dplyr::group_by(polo_mp, idade) |>
  dplyr::summarise(
    prop_negados = mean(decision == "Negaram"),
    unanimidade = mean(unanimidade == "Unânime"),
    .groups = "drop"
  ) |>
  reactable::reactable(list(
    prop_negados = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    ),
    unanimidade = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    )
  ))
Código
aux_magistrado_comp |>
  dplyr::group_by(polo_mp, origem) |>
  dplyr::summarise(
    prop_negados = mean(decision == "Negaram"),
    unanimidade = mean(unanimidade == "Unânime"),
    .groups = "drop"
  ) |>
  reactable::reactable(list(
    prop_negados = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    ),
    unanimidade = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    )
  ))
Código
aux_magistrado_comp |>
  dplyr::group_by(polo_mp, capital) |>
  dplyr::summarise(
    prop_negados = mean(decision == "Negaram"),
    unanimidade = mean(unanimidade == "Unânime"),
    .groups = "drop"
  ) |>
  reactable::reactable(list(
    prop_negados = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    ),
    unanimidade = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    )
  ))
Código
aux_magistrado_comp |>
  dplyr::group_by(polo_mp, faculdade) |>
  dplyr::summarise(
    prop_negados = mean(decision == "Negaram"),
    unanimidade = mean(unanimidade == "Unânime"),
    .groups = "drop"
  ) |>
  reactable::reactable(list(
    prop_negados = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    ),
    unanimidade = reactable::colDef(
      align = "center",
      format = reactable::colFormat(percent = TRUE, digits = 1)
    )
  ))

Relatores não encontrados

Código
aux_composicao |>
  dplyr::count(magistrado) |>
  dplyr::mutate(
    nome = clean_nm(magistrado)
  ) |>
  dplyr::anti_join(aux_magistrado, "nome") |>
  dplyr::arrange(dplyr::desc(n)) |>
  reactable::reactable()